#ifndef __DRIVERS_INSDRV_GPIO_H__
#define __DRIVERS_INSDRV_GPIO_H__

//#include <platform/platform.h>
#include "gpio_BAT32G157.h"

typedef enum _InsDrv_Gpio_Mode_e
{
    INSDRV_GPIO_MODE_INPUT = 0,
    INSDRV_GPIO_MODE_OUTPUT,
    INSDRV_GPIO_MODE_OD_OUTPUT,//open-drain

    INSDRV_GPIO_MODE_NUM,
}InsDrv_Gpio_Mode_e;

typedef enum _InsDrv_Gpio_Level_e
{
    INSDRV_GPIO_LEVEL_LOW = 0,
    INSDRV_GPIO_LEVEL_HIGH,

    INSDRV_GPIO_LEVEL_NUM,
}InsDrv_Gpio_Level_e;

typedef enum _InsDrv_Gpio_PullMode_e
{
    INSDRV_GPIO_NOPULL = 0,
    INSDRV_GPIO_PULLUP,
    #if (PLATFORM_CHIP == PLATFORM_BAT32G135S)
    INSDRV_GPIO_PULLDOWN,        //137不支持下拉
    #endif
    INSDRV_GPIO_PULLMODE_NUM,
}InsDrv_Gpio_PullMode_e;



#define INSDRV_GPIO_PINMASK(pin)        (1 << pin)

#if (PLATFORM_CHIP == PLATFORM_BAT32G137)
    //#include <platform/BAT32G137/drivers/gpio_BAT32G137.h>
#elif (PLATFORM_CHIP == PLATFORM_BAT32G135S)
    //#include <platform/BAT32G135S/drivers/gpio_BAT32G135S.h>
#elif (PLATFORM_CHIP == PLATFORM_BAT32G157)
    #include "gpio_BAT32G157.h"
#else
typedef enum _InsDev_Gpio_Port_e
{
    INSDRV_GPIO_PORTA = 0,
    INSDRV_GPIO_PORTB = 1,
    INSDRV_GPIO_PORTC = 2,
    INSDRV_GPIO_PORTD = 3,
    INSDRV_GPIO_PORTE = 4,
    INSDRV_GPIO_PORTF = 5,
    INSDRV_GPIO_PORTG = 6,
    INSDRV_GPIO_PORTH = 7,
    INSDRV_GPIO_PORTI = 12,
    INSDRV_GPIO_PORTJ = 13,
    INSDRV_GPIO_PORTK = 14,

    INSDRV_GPIO_PORT_NUM,
}InsDev_Gpio_Port_e;

typedef enum _InsDev_Gpio_Pin_e
{
    INSDRV_GPIO_PIN_0 = 0,
    INSDRV_GPIO_PIN_1,
    INSDRV_GPIO_PIN_2,
    INSDRV_GPIO_PIN_3,
    INSDRV_GPIO_PIN_4,
    INSDRV_GPIO_PIN_5,
    INSDRV_GPIO_PIN_6,
    INSDRV_GPIO_PIN_7,
    INSDRV_GPIO_PIN_8,
    INSDRV_GPIO_PIN_9,
    INSDRV_GPIO_PIN_10,
    INSDRV_GPIO_PIN_11,
    INSDRV_GPIO_PIN_12,
    INSDRV_GPIO_PIN_13,
    INSDRV_GPIO_PIN_14,
    INSDRV_GPIO_PIN_15,

    INSDRV_GPIO_PIN_NUMS,
}InsDev_Gpio_Pin_e;

typedef enum _InsDev_Gpio_EInt_Num_e
{
    INSDRV_GPIO_EINT0 = 0,
    INSDRV_GPIO_EINT1,
    INSDRV_GPIO_EINT2,
    INSDRV_GPIO_EINT3,
    INSDRV_GPIO_EINT4,
    INSDRV_GPIO_EINT5,
    INSDRV_GPIO_EINT6,
    INSDRV_GPIO_EINT7,
    INSDRV_GPIO_EINT8,
    INSDRV_GPIO_EINT9,
    INSDRV_GPIO_EINT10,
    INSDRV_GPIO_EINT11,

    INSDRV_GPIO_EINT_NUM,
}InsDev_Gpio_EInt_Num_e;

typedef enum _InsDrv_Gpio_Int_e
{
    INSDRV_GPIO_INT_NONE = 0,
    INSDRV_GPIO_INT_FALLING,
    INSDRV_GPIO_INT_RISING,
    INSDRV_GPIO_INT_BOTH,
    INSDRV_GPIO_INT_HIGH,
    INSDRV_GPIO_INT_LOW,

    INSDRV_GPIO_INT_NUM,
}InsDrv_Gpio_IntType_e;

#endif

typedef void (*InsDrv_Gpio_Isr_f)(void);

int32_t InsDrv_Gpio_Init(InsDrv_Gpio_Group_Config_t *p_group_cfg);

void InsDrv_Gpio_SetMode(InsDrv_Gpio_Port_e port, InsDrv_Gpio_Pin_e pin, InsDrv_Gpio_Mode_e mode);
void InsDrv_Gpio_Output(InsDrv_Gpio_Port_e port, InsDrv_Gpio_Pin_e pin, InsDrv_Gpio_Level_e level);
InsDrv_Gpio_Level_e InsDrv_Gpio_GetPinLevel(InsDrv_Gpio_Port_e port, InsDrv_Gpio_Pin_e pin);
void InsDrv_Gpio_Toggle(InsDrv_Gpio_Port_e port, InsDrv_Gpio_Pin_e pin);
void InsDrv_Gpio_SetPullCtrl(InsDrv_Gpio_Port_e port, InsDrv_Gpio_Pin_e pin, InsDrv_Gpio_PullMode_e pull_mode);

// void InsDrv_Gpio_SetAltFunc(InsDrv_Gpio_Port_e port, InsDrv_Gpio_Pin_e pin, uint32_t alt_func);
void InsDrv_Gpio_IsrHook(InsDrv_Gpio_Port_e port, InsDrv_Gpio_Pin_e pin, InsDrv_Gpio_Isr_f cb_func);
void InsDrv_Gpio_EnableInt(InsDrv_Gpio_Port_e port, InsDrv_Gpio_Pin_e pin, InsDrv_Gpio_IntType_e int_type);
void InsDrv_Gpio_DisableInt(InsDrv_Gpio_Port_e port, InsDrv_Gpio_Pin_e pin);
void InsDrv_Gpio_Disable_MCU_USB(void);
void InsDrv_Gpio_Enable_MCU_USBPin(void);
void InsDrv_Gpio_Disable_MCU_USBPin(void);

#endif
